/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.documentar.model;

import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import javax.swing.DefaultComboBoxModel;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author Santos
 */
public class CategoriaArvoreModel {

    private int codigo;
    private CategoriaArvoreModel codigoPai;
    private ProdutoModel produto;
    private String codigoProcesso;
    private String nome;
    private char ativo;
    private char temFilho;
    private String objetivo;
    private String periodicidade;
    private String consNaoUso;
    private String linkVideo;
    private String caminhoCompleto;
    private String caminhoSemItemProprio;
    private VersaoModel versaoModel;
    private String nomeTela;

    public String getNomeTela() {
        return nomeTela;
    }

    public void setNomeTela(String nomeTela) {
        this.nomeTela = nomeTela;
    }

    public VersaoModel getVersaoModel() {
        if (versaoModel == null) {
            versaoModel = new VersaoModel();
        }
        return versaoModel;
    }

    public void setVersaoModel(VersaoModel versaoModel) {
        this.versaoModel = versaoModel;
    }

    public String getCaminhoCompleto() {
        return caminhoCompleto;
    }

    public void setCaminhoCompleto(String caminhoCompleto) {
        this.caminhoCompleto = caminhoCompleto;
    }

    public String getCaminhoSemItemProprio() {
        return caminhoSemItemProprio;
    }

    public void setCaminhoSemItemProprio(String caminhoSemItemProprio) {
        this.caminhoSemItemProprio = caminhoSemItemProprio;
    }

    public String getObjetivo() {
        return objetivo;
    }

    public void setObjetivo(String objetivo) {
        this.objetivo = objetivo;
    }

    public String getPeriodicidade() {
        return periodicidade;
    }

    public void setPeriodicidade(String periodicidade) {
        this.periodicidade = periodicidade;
    }

    public String getConsNaoUso() {
        return consNaoUso;
    }

    public void setConsNaoUso(String consNaoUso) {
        this.consNaoUso = consNaoUso;
    }

    public String getLinkVideo() {
        return linkVideo;
    }

    public void setLinkVideo(String linkVideo) {
        this.linkVideo = linkVideo;
    }

    /**
     * Ação do script SQL na execução do programa
     */
    private String actionScript;
    /**
     * Modelo de um comboBox para utiliza nas telas
     */
    private DefaultComboBoxModel modelComboBox;
    /**
     * Modelo de uma table para utilizar nas telas
     */
    private DefaultTableModel modelTable;
    /**
     * Lista contendo os dados relacionados da consulta feita na tabela setor.
     * Mas é necessário rever o nome dessa variável, sugestão: lista+Classe
     */
    private List<CategoriaArvoreModel> listaArvore;
    /**
     * Variavel responsável por recepcionar dados extraidos das consultas
     * executadas na banco de dados
     */
    private ResultSet resultSet;

    public char getTemFilho() {
        return temFilho;
    }

    public void setTemFilho(char temFilho) {
        this.temFilho = temFilho;
    }

    public int getCodigo() {
        return codigo;
    }

    public void setCodigo(int codigo) {
        this.codigo = codigo;
    }

    public CategoriaArvoreModel getCodigoPai() {
        if (codigoPai == null) {
            codigoPai = new CategoriaArvoreModel();
        }
        return codigoPai;
    }

    public void setCodigoPai(CategoriaArvoreModel codigoPai) {
        this.codigoPai = codigoPai;
    }

    public ProdutoModel getProduto() {
        if (produto == null) {
            produto = new ProdutoModel();
        }
        return produto;
    }

    public void setProduto(ProdutoModel produto) {
        this.produto = produto;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public char getAtivo() {
        return ativo;
    }

    public void setAtivo(char ativo) {
        this.ativo = ativo;
    }

    public String getActionScript() {
        return actionScript;
    }

    public void setActionScript(String actionScript) {
        this.actionScript = actionScript;
    }

    public String getCodigoProcesso() {
        return codigoProcesso;
    }

    public void setCodigoProcesso(String codigoProcesso) {
        this.codigoProcesso = codigoProcesso;
    }

    public DefaultComboBoxModel getModelComboBox() {
        if (modelComboBox == null) {
            modelComboBox = new DefaultComboBoxModel();
            modelComboBox.addElement("ESCOLHER");
            modelComboBox.addElement("0 - RAIZ");
        }
        return modelComboBox;
    }

    public void setModelComboBox(DefaultComboBoxModel modelComboBox) {
        this.modelComboBox = modelComboBox;
    }

    public DefaultTableModel getModelTable() {
        if (modelTable == null) {
            modelTable = new DefaultTableModel();
            modelTable.addColumn("Codigo");
            modelTable.addColumn("Produto");
            modelTable.addColumn("Codigo Processo");
            modelTable.addColumn("Nome");
            modelTable.addColumn("Codigo Pai");
            modelTable.addColumn("Ativo");
            modelTable.addColumn("Tem Filho");
            modelTable.addColumn("Objetivo");
            modelTable.addColumn("Periodicidade");
            modelTable.addColumn("Consequencia do Não Uso");
            modelTable.addColumn("Link do Vídeo");
        }
        return modelTable;
    }

    public void setModelTable(DefaultTableModel modelTable) {
        this.modelTable = modelTable;
    }

    public List<CategoriaArvoreModel> getListaArvore() {
        if (listaArvore == null) {
            listaArvore = new ArrayList<>();
        }
        return listaArvore;
    }

    public void setListaArvore(List<CategoriaArvoreModel> listaArvore) {
        this.listaArvore = listaArvore;
    }

    public ResultSet getResultSet() {
        return resultSet;
    }

    public void setResultSet(ResultSet resultSet) {
        this.resultSet = resultSet;
    }

    /**
     * Metodo responsável por encontrar o cadastro do setor em uma lista
     *
     * @param codigo Codigo de identificação do setor
     * @return Modelo da Classe com o dado encontrado
     */
    public CategoriaArvoreModel getCategoria(int codigo) {
        CategoriaArvoreModel model = null;
        for (CategoriaArvoreModel arvoreModel : getListaArvore()) {
            if (arvoreModel.getCodigo() == codigo) {
                model = arvoreModel;
                break;
            }
        }
        return model;
    }

    public CategoriaArvoreModel getCategoria(String nome) {
        CategoriaArvoreModel model = null;
        for (CategoriaArvoreModel arvoreModel : getListaArvore()) {
            if (arvoreModel.getNome().equals(nome)) {
                model = arvoreModel;
                break;
            }
        }
        return model;
    }
    /**
     * Variável auxiliar para ordenar a lista
     */
    List<CategoriaArvoreModel> listaOrdenada = new ArrayList<>();

    /**
     * Metodo responsável por ordenar os dados em uma lista para exibição dos
     * dados
     *
     * @param lista
     * @return
     */
    public List<CategoriaArvoreModel> getOrdenaArvore(List<CategoriaArvoreModel> lista) {

        for (CategoriaArvoreModel arvoreModel : lista) {
            //verificar se é raiz, se o codigo do pai for igual a zero
            if (arvoreModel.getCodigoPai().getCodigo() == 0) {

                //verificar se ja existe
                boolean exists = false;
                for (CategoriaArvoreModel checkExists : listaOrdenada) {
                    if (arvoreModel.getCodigo() == checkExists.getCodigo()) {
                        exists = true;
                    }
                }
                if (exists == false) {
                    //   System.out.println(arvoreModel.getCodigoProcesso() + " - " + arvoreModel.getNome());
                    listaOrdenada.add(arvoreModel);
                }

                getFilhoNoRaiz(lista, arvoreModel, 1);
            }

        }
        return listaOrdenada;
    }

    public void getFilhoNoRaiz(List<CategoriaArvoreModel> listaOriginal, CategoriaArvoreModel model, int nivel) {
        if (model.getTemFilho() == 'N') {
            //return model;
        } else {
            for (CategoriaArvoreModel modelArvore : listaOriginal) {
                if (model.getCodigo() == modelArvore.getCodigoPai().getCodigo()) {
                    //verifica se já foi adicionado
                    boolean exists = false;
                    for (CategoriaArvoreModel checkExists : listaOrdenada) {
                        if (checkExists.getCodigo() == modelArvore.getCodigo()) {
                            exists = true;
                        }
                    }
                    if (exists == false) {
                        //System.out.println("|" + getTracoSeparador(nivel) + "-> " + modelArvore.getCodigoProcesso() + " - " + modelArvore.getNome());
                        listaOrdenada.add(modelArvore);
                        getFilhoNoRaiz(listaOriginal, modelArvore, nivel + 1);
                    }

                }
            }
        }

    }

    /**
     * Metodo responsável por gerar um traço separador pelo nível do item na
     * arvore
     *
     * @param quantidade
     * @return
     */
    public String getTracoSeparador(int quantidade) {
        String traco = "-";
        for (int i = 0; i < quantidade; i++) {
            traco = traco.concat("-");
        }
        return traco;
    }
}
